﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace Ruandao.MiniFace
{
    static public class UrlUtility
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="url">包含以下情况：
        /// 1. 以"/"打头，表示相对于网站根目录的路径。
        /// 2. 以"~/"打头，表示相对于应用程序目录的路径。
        /// 3. 以"http://"打头，表示完全限定的路径。
        /// 4. 不以上述特殊方式打头的路径，表示相对于location的路径。
        /// </param>
        /// <param name="location">url所在的位置。必须是完全限定路径或者是绝对路径。</param>
        /// <returns>
        /// 返回以"/"打头的网站绝对路径，或者是返回以"http://"打头的完全限定路径。
        /// </returns>
        public static string ClientUrl( string url, string location = "" )
        {
            // 1. 完全限定的http路径，包含协议、域名和端口号。
            if (url.StartsWith("http://")) return url;

            HttpRequest request = HttpContext.Current.Request;
            // 2. 基于网站根，不包含协议、域名和端口号的绝对路径。
            if (url.StartsWith("/"))
            {
                //return Ruandao.Misc.UtilityFunction.CombineUrl(
                //    "http://" + request.Url.Host + ":" + request.Url.Port, url);
                return url;
            }

            // 3. 基于应用程序主目录的相对路径。
            if (url.StartsWith("~/"))
            {
                string appPath = request.ApplicationPath;
                if (appPath == "/")
                {
                    return Ruandao.Misc.UtilityFunction.CombineUrl(
                        "http://" + request.Url.Host + ":" + request.Url.Port, url.Substring(2));
                }
                string absUri = request.Url.AbsoluteUri;
                int pos = absUri.IndexOf(appPath) + appPath.Length;
                return Ruandao.Misc.UtilityFunction.CombineUrl(absUri.Substring(0, pos), url.Substring(2));
            }

            // 4. 基于location的路径。注意目前没有考虑../.的上一级/下一级的目录分析，仅仅是直接连在一起。
            return Ruandao.Misc.UtilityFunction.CombineUrl( location, url);
        }
    }
}
